home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / batchut / dcsetenv.zip / ENVVAR.C next >
C/C++ Source or Header  |  1989-02-16  |  2KB  |  119 lines

  1. /* envvar.c -- a collection of routines to modify the parent environment */
  2. /* Originally coded by "Jim Anderson" <bilbo.jta@SEAS.UCLA.EDU> */
  3. /* Modified by "David J. Camp" <david%wubios@wucs1.wustl.edu> */
  4.  
  5. /*
  6.    Routines to maniplate command.com's copy of the environment.
  7.    Must be compiled for a large data model (compact, large or huge).
  8.    Must use -Zp option.
  9. */
  10.  
  11. #include <dos.h>
  12. #include <stddef.h>
  13. #include <stdio.h>
  14.  
  15. static
  16. char far *
  17. envptr(size)
  18. int *size;
  19. {
  20.     struct INT_VEC {
  21.     unsigned short off, seg;
  22.     } far *intvecs;
  23.  
  24.     struct MCB {
  25.     char id;
  26.     unsigned int owner;
  27.     unsigned int size;
  28.     } far *mcb;
  29.  
  30.     struct PSP {
  31.     char pad[0x2c];
  32.     unsigned short envseg;
  33.     } far *psp;
  34.  
  35.     char far *env;
  36.     unsigned int cmdpid;
  37.  
  38.  
  39.     intvecs = (struct INT_VEC far *) 0L;
  40.     cmdpid = intvecs[0x2e].seg;
  41.  
  42.     mcb = (struct MCB far *) ((long)(cmdpid - 1) << 16);
  43.  
  44.     do {
  45.     mcb = (struct MCB far *) (((long)(FP_SEG(mcb) + mcb->size + 1)) << 16);
  46.     } while (mcb->owner != cmdpid && mcb->id == 'M');
  47.  
  48.     if (mcb->owner == cmdpid) {
  49.     env = (char far *) ((long)(FP_SEG(mcb) + 1) << 16);
  50.     *size = mcb->size * 16;
  51.     }
  52.     else {
  53.     fprintf(stderr, "Cannot find command environment\n");
  54.     exit(1);
  55.     }
  56.  
  57.     return env;
  58. }
  59.  
  60. int
  61. msetenv(var,value)
  62. char *var, *value;
  63.  
  64. {
  65. char *env1, *env2;
  66. char *cp;
  67. int size;
  68. int l;
  69.  
  70. env1 = env2 = envptr(&size);
  71. l = strlen(var);
  72. strupr(var);
  73.  
  74. while (*env2)
  75.     {
  76.     if ((strncmp(var,env2,l) == 0) && (env2[l] == '='))
  77.         {
  78.         cp = env2 + strlen(env2) + 1;
  79.         memcpy (env2, cp, size - (cp - env1));
  80.         }
  81.     else
  82.         {
  83.         env2 += strlen (env2) + 1;
  84.         }
  85.     }
  86.  
  87. if (strlen(value) == 0)
  88.     return(0);
  89.  
  90. if (size - (env2 - env1) >= l + strlen(value) + 3)
  91.     {
  92.     strcpy(env2,var);
  93.     strcat(env2,"=");
  94.     strcat(env2,value);
  95.     env2[strlen(env2)+1] = 0;
  96.     return(0);
  97.     }
  98. return(-1);
  99. }
  100.  
  101. char far *
  102. mgetenv(var)
  103. char *var;
  104. {
  105.     int l;
  106.     char *env;
  107.  
  108.     env = envptr(&l);
  109.     l = strlen(var);
  110.     strupr(var);
  111.  
  112.     while (*env) {
  113.     if ((strncmp(env,var,l) == 0) && (env[l] == '='))
  114.         return(env + l + 1);
  115.     env += strlen(env) + 1;
  116.     }
  117.     return(NULL);
  118. }
  119.